package org.smart4j.framework.common.aop;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.List;

/**
 * 代理管理器
 * 创建所有的代理对象
 *
 * @author YooLin1c
 * @version 1.0.0
 * @since 2018-02-03 14:04
 */
public class ProxyManager {

    /**
     * 创建代理对象（使用CGLIB作为动态代理）
     *
     * @param targetClass 目标类
     * @param proxyChain  代理链
     * @param <T>         目标类泛型
     * @return 代理对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyChain) {
        return (T) Enhancer.create(targetClass, new MethodInterceptor() {
            @Override
            public Object intercept(Object targetObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                return new ProxyChain(targetClass, targetObject, method, methodProxy, args, proxyChain).doProxyChain();
            }
        });
    }
}
